package java学习.第16章_网络编程;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * ● TCP协议:
 * ➢使用TCP协议前，须先建立TCP连接，形成传输数据通道
 * ➢传输前，采用“三次握手”方式，点对点通信，是"可靠的"(四次挥手)
 * ➢TCP协议进行通信的两个应用进程:客户端、服务端。
 * ➢在连接中可进行大数据量的传输
 * ➢传输完毕，需释放已建立的连接，效率低
 * ● UDP协议:
 * ➢将数据、源、目的封装成数据包，"不需要建立连接"
 * ➢每个数据报的大小限制在64K内
 * ➢发送不管对方是否准备好，接收方收到也不确认，故是"不可靠的"
 * ➢可以广播发送
 * ➢发送数据结束时无需释放资源，开销小，速度快
 */
public class C_协议 {
    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            //创建Socket对象，指明服务器端的ip和端口号
//            InetAddress inet = InetAddress.getByName("127.0.0.1");
            InetAddress inet = InetAddress.getLocalHost();
            socket = new Socket(inet, 65534);
            os = socket.getOutputStream();//获取输出流  获得输出数据
            os.write("你好，我是客户端\n".getBytes());//写出数据操作
            os.flush();
            socket.shutdownOutput();//关闭输出流

            baos = new ByteArrayOutputStream();
            is = socket.getInputStream();
            byte[] bytes = new byte[5];
            int len;
            while ((len = is.read(bytes)) != -1) {
                baos.write(bytes, 0, len);//把输入流的内容  写道ByteArrayOutputStream里
            }
            System.out.println(socket.getInetAddress() + ":" + baos.toString());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
                baos.close();
                is.close();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
